;-----------------------------------------------------------------------------
;  spr_3a.src -- SPR ライブラリ 2A モジュール
;  Copyright(c) 1994 SEGA
;  Written by H.E on 1994-07-25 Ver.1.00
;  Updated by H.E on 1995-02-20 Ver.1.00
;
;  このライブラリはスプライト３Ｄ表示処理モジュールで、以下のルーチンを含む。
;
;  SPR_3GetShdColor            -  ＲＧＢカラーの輝度による変換
;  SPR_3AllCoordTransClipPers  -  全頂点の座標変換、透視変換、クリップ処理
;  SPR_3AllCoordTrans          -  全頂点の座標変換
;  SPR_3AllSurfaceBright       -  全面の隠面処理と輝度計算
;  SPR_3AllVertBright          -  全頂点の輝度計算
;
;----------------------------------------------------------------------------
;
          .EXPORT     _SPR_3GetShdColor
          .EXPORT     _SPR_3AllCoordTransClipPers
          .EXPORT     _SPR_3AllCoordTrans
          .EXPORT     _SPR_3AllSurfaceBright
          .EXPORT     _SPR_3AllVertBright
          .SECTION    SEGA_P,CODE,ALIGN=4
;
;*****************************************************************************
;*
;* NAME:  SPR_3GetShdColor  - Compute RGB Shading Color
;*
;*        rgbColor = getShdColor(Uint16 baseRgbColor, Uint16 bright)
;*
;* PARAMETERS :
;*
;*     (1) Uint16  baseRgbColor  - <i>  元ＲＧＢカラー
;*     (2) Uint16  bright        - <i>  輝度（０−３１）
;*
;* DESCRIPTION:
;*
;*     ＲＧＢカラーを輝度により計算し返す
;*
;*
;* POSTCONDITIONS:
;*
;*     (1) Uint16  rgbColor      - <o>  ＲＧＢカラー
;*
;* CAVEATS:
;*
;*****************************************************************************
;
_SPR_3GetShdColor:
 	  STS.L	      MACL,@-R15
;                                      ; R4  : baseRgbColor
;                                      ; R5  : bright
          EXTU.W      R4,R1            ; R1  : r
          MOV.L       R1,R2            ; R2  : g
          MOV.L       R1,R3            ; R3  : b
          MOV         #31,R0
          AND         R0,R1            ; r =  baseRgbColor & 0x001f
          MOV.W       GS_03E0,R4
          AND         R4,R2
          SHLR2       R2
          SHLR2       R2
          SHLR        R2               ; g = (baseRgbColor & 0x03e0) >> 5
          MOV.W       GS_7C00,R0
          AND         R0,R3
          SHLR8       R3
          SHLR2       R3               ; b = (baseRgbColor & 0x7c00) >> 10
;
          MOV.L       GS_8000,R0       ; rgbColor  = 0x8000
          MUL.L       R1,R5
          STS         MACL,R6
          SHLR2       R6
          SHLR2       R6
          SHLR        R6
          ADD         R6,R0            ; rgbColor += (r * bright) >> 5
          MUL.L       R2,R5
          STS         MACL,R6
          AND         R4,R6
          ADD         R6,R0            ; rgbColor += ((g * bright) & 0x03e0)
          MUL.L       R3,R5
          STS         MACL,R6
          AND         R4,R6
          SHLL2       R6
          SHLL2       R6
          SHLL        R6
          ADD         R6,R0         ; rgbColor += ((b * bright) & 0x03e0) << 5
          RTS
          LDS.L       @R15+,MACL
;
	  .ALIGN      4
GS_03E0:  .DATA.W     H'03E0
GS_7C00:  .DATA.W     H'7C00
GS_8000:  .DATA.L     H'00008000
;
;
;*************************************************************************
;*
;* NAME : SPR_3AllCoordTransClipPers  -  
;*                   Coord Transfer and Cliping and Perspect of All Vertices
;*
;*   void    SPR_3AllCoordTransClipPers(MthMatrix *matrix, MthXyz *src,
;*                               MthXyz *ans3D, XyInt *ans2D, int vertCnt,
;*                   Sint32 *unitPixel, Fixed32 *clipRatio, Fixed32 *clipZ)
;*
;* PARAMETERS
;*
;* 　　(1) MthMatrix *matrix    - <i> 座標変換マトリックス
;* 　　(2) MthXyz    *src       - <i> 変換前頂点座標
;* 　　(3) MthXyz    *ans3D     - <o> 変換後３Ｄ 頂点座標
;* 　　(4) MthXy     *ans2D     - <o> 変換後２Ｄ X,Y 頂点座標
;* 　　(5) Sint32    vertCnt    - <i> 頂点数
;* 　　(6) Sint32    *unitPixel - <i> ２Ｄ単位ピクセル数 X,Y
;* 　　(7) Fixed32   *clipRatio - <i> ３Ｄクリッピング X,Y
;* 　　(8) Fixed32   *clipZ     - <i> ３Ｄクリッピング Z min, max
;*
;* DESCRIPTION
;*
;* 　　(1) マトリックス演算・頂点の座標変換
;* 　　(2) ３Ｄピラミッドでのクリッピング
;* 　　(3) ２Ｄへの透視変換
;*
;* POSTCONDITIONS
;* 
;* CAVEATS
;* 
;*************************************************************************
;
_SPR_3AllCoordTransClipPers:          ; function: SPR_3AllCoordTransClipPers
          MOV.L       R14,@-R15
          MOV.L       R13,@-R15
          MOV.L       R12,@-R15
          MOV.L       R11,@-R15
          MOV.L       R10,@-R15
          MOV.L       R9,@-R15
          MOV.L       R8,@-R15
          STS.L       MACH,@-R15
          STS.L       MACL,@-R15
;
          MOV.L       @(36,R15),R8	; R8  = vertCnt
          MOV.L       @(40,R15),R0
          MOV.L       @R0,R9		; R9  = unitPixel.x
          MOV.L       @(4,R0),R10	; R10 = unitPixel.y
          MOV.L       @(44,R15),R0
          MOV.L       @R0,R11		; R11 = clipRatio.x
          MOV.L       @(4,R0),R12	; R12 = clipRatio.y
          MOV.L       @(48,R15),R0
          MOV.L       @R0,R13		; R13 = clipZ.min
          MOV.L       @(4,R0),R14	; R14 = clipZ.max
;
_SPR_3ATCP00:
          MOV         R5,R1     	; R1 = (Xa, Ya, Za)
          CLRMAC
          ADD         #32,R4
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0       	; R0 = M20Xa+M21Ya+M22Za
          MOV.L       @R4+,R3
          ADD         R0,R3       	; R3 = R0 + M23
          CMP/GT      R3,R13      	; if(R3 < R13:clipZ.min)
          BT          _SPR_3ATCP01	;      goto _SPR_3ATCP01
          CMP/GE      R3,R14		; if(R14:clipZ.max >= R3)
          BT          _SPR_3ATCP02	;       goto _SPR_3ATCP02
_SPR_3ATCP01:
          MOV.L       #0,R0     	; R0 = 0
          MOV.L       R0,@(8,R6)      	; Zn = R0
          BRA         _SPR_3ATCP99	; goto _SPR_3ATCP99
          ADD         #-48,R4		; R4 -= 48
_SPR_3ATCP02:
          MOV.L       R3,@(8,R6)      	; Zn = R0
;
; hz = SPR_3Div(unitPixel.x,Zn);
;
	  MOV.L	      A_DIV,R0
	  MOV.L       R3,@R0       	; <- Zn
	  MOV.L       R9,@(H'10,R0)     ; <- (upper) = unitPixel.x
	  MOV.L       #0,R2
	  MOV.L       R2,@(H'14,R0)     ; <- (lower) = 0
;
          MOV         R5,R1     	; R1 = (Xa, Ya, Za)
          CLRMAC
          ADD         #-48,R4
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0      	; R0 = M00Xa+M01Ya+M02Za
          MOV.L       @R4+,R2
          ADD         R0,R2      	; Xn = R2 = R0 + M03
          MOV.L       R2,@R6
;
          DMULS.L     R11,R3
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0      	; R0 = clipRatio.x * Zn
;
          CMP/EQ      #0,R0		; if(R0 == 0)
          BT          _SPR_3ATCP04	;      goto _SPR_3ATCP04
          CMP/GT      R0,R2      	; if(R0 < R2:Xn)
          BT          _SPR_3ATCP03	;      goto _SPR_3ATCP03
          NEG         R0,R0
          CMP/GT      R0,R2		; if(R0 < R2:Xn)
          BT          _SPR_3ATCP04	;      goto _SPR_3ATCP04
_SPR_3ATCP03:
          MOV.L       #0,R0      	; R0 = 0
          MOV.L       R0,@(8,R6)      	; Zn = R0
	  MOV.L       A_DIV,R0
 	  MOV.L	      @(H'14,R0),R1     ; -> R1 (hz = unitPixel.x/Zn)
          BRA         _SPR_3ATCP99	; goto _SPR_3ATCP99
          ADD         #-16,R4
_SPR_3ATCP04:
	  MOV.L       A_DIV,R0
 	  MOV.L	      @(H'14,R0),R1     ; -> R1 (hz = unitPixel.x/Zn)
;
	  DMULS.L     R1,R2             ; MACH,L = Xn * (unitPixel.x/Zn)
 	  STS	      MACH,R1
	  MOV.W	      R1,@R7            ; R0 -> pers X
;
;
; hz = SPR_3Div(unitPixel.y,Zn);
;
	  MOV.L       R3,@R0       	; <- Zn
	  MOV.L       R10,@(H'10,R0)    ; <- (upper) = unitPixel.y
	  MOV.L       #0,R2
	  MOV.L       R2,@(H'14,R0)     ; <- (lower) = 0
;
          MOV         R5,R1     	; R1 = (Xa, Ya, Za)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0      	; R0 = M10Xa+M11Ya+M12Za
          MOV.L       @R4+,R2
          ADD         R0,R2      	; Yn = R2 = R0 + M03
          MOV.L       R2,@(4,R6)
;
          DMULS.L     R12,R3
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0      	; R0 = clipRatio.y * Zn
;
          CMP/EQ      #0,R0		; if(R0 == 0)
          BT          _SPR_3ATCP06	;      goto _SPR_3ATCP06
          CMP/GT      R0,R2      	; if(R0 < R2:Yn)
          BT          _SPR_3ATCP05	;      goto _SPR_3ATCP05
          NEG         R0,R0
          CMP/GE      R0,R2		; if(R0 < R2:Yn)
          BT          _SPR_3ATCP06	;      goto _SPR_3ATCP06
_SPR_3ATCP05:
          MOV.L       #0,R0      	; R0 = 0
          MOV.L       R0,@(8,R6)      	; Zn = R0
_SPR_3ATCP06:
          ADD         #-32,R4
	  MOV.L       A_DIV,R0
 	  MOV.L	      @(H'14,R0),R1     ; -> R1 (hz = unitPixel.y/Zn)
;
	  DMULS.L     R1,R2             ; MACH,L = Yn * (unitPixel.y/Zn)
 	  STS	      MACH,R0
	  MOV.W	      R0,@(2,R7)        ; R0 -> pers Y
;
_SPR_3ATCP99:
          ADD         #12,R5
          ADD         #12,R6
          DT          R8
          BF/S        _SPR_3ATCP00
          ADD         #4,R7
;
          LDS.L       @R15+,MACL
          LDS.L       @R15+,MACH
          MOV.L       @R15+,R8
          MOV.L       @R15+,R9
          MOV.L       @R15+,R10
          MOV.L       @R15+,R11
          MOV.L       @R15+,R12
          MOV.L       @R15+,R13
          RTS
          MOV.L       @R15+,R14
;
;
	.ALIGN	4
A_DIV		.DATA.L	H'FFFFFF00
FIXED_MIN	.DATA.L	H'80000000
;
;
;
;
;*************************************************************************
;*
;* NAME : SPR_3AllCoordTrans  -   Coord Transfer of All Vertices
;*
;*   void    SPR_3AllCoordTrans(MthMatrix *matrix, MthXyz *src,
;*                              int vertCnt, MthXyz *ans)
;*
;* PARAMETERS
;*
;* 　　(1) MthMatrix *matrix    - <i> R4 座標変換マトリックス
;* 　　(2) MthXyz    *src       - <i> R5 変換前頂点座標
;* 　　(3) Sint32    vertCnt    - <i> R6 頂点数
;* 　　(4) MthXyz    *ans       - <o> R7 変換後頂点座標
;*
;* DESCRIPTION
;*
;* 　　全頂点の座標変換
;*
;* POSTCONDITIONS
;* 
;* CAVEATS
;* 
;*************************************************************************
;
_SPR_3AllCoordTrans:          ; function: SPR_3AllCoordTrans
          STS.L       MACH,@-R15
          STS.L       MACL,@-R15
;
_SPR_3AT00:
          MOV         R5,R1     	; R1 = (Xa, Ya, Za)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0
          MOV.L       @R4+,R3
          ADD         R3,R0       	; R0 = Xn = M00Xa + M01Ya + M02Za + M03
          MOV.L       R0,@R7            ; @R7+ = R0
;
          MOV         R5,R1     	; R1 = (Xa, Ya, Za)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0
          MOV.L       @R4+,R3
          ADD         R3,R0       	; R0 = Yn = M10Xa + M11Ya + M12Za + M13
          MOV.L       R0,@(4,R7)        ; @R7+ = R0
;
          MOV         R5,R1     	; R1 = (Xa, Ya, Za)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0
          MOV.L       @R4+,R3
          ADD         R3,R0       	; R0 = Zn = M20Xa + M21Ya + M22Za + M23
          MOV.L       R0,@(8,R7)        ; @R7+ = R0
;
          ADD         #12,R5
          ADD         #12,R7
          DT          R6
          BF/S        _SPR_3AT00
          ADD         #-48,R4
;
          LDS.L       @R15+,MACL
          RTS
          LDS.L       @R15+,MACH
;
;
;*************************************************************************
;*
;* NAME : SPR_3AllSurfaceBright  -  Compute All Surface Bright
;*
;*     void    SPR_3AllSurfaceBright(MthMatrix *matrix, SprSurface *surfInfo,
;*                               MthXyz *surfaceNormal, Sint32 *surfaceBright,
;*                               MthXyz *lightVector, Sint32 surfCnt,
;*                               MthXyz *coordView3D);
;*
;* PARAMETERS
;*
;* 　　(1) MthMatrix  *matrix        - <i> R4 座標変換マトリックス
;* 　　(2) SprSurface *surfInfo      - <i> R5 面情報テーブル
;* 　　(3) MthXyz     *surfaceNormal - <i> R6 面の法線ベクトル
;* 　　(4) Sint32     *surfaceBright - <o> R7 面の輝度計算結果
;* 　　(5) MthXyz     *lightVector   - <i> R8 光源ベクトル
;* 　　(6) Sint32     surfCnt        - <i> R9 面数
;* 　　(7) MthXyz     *coordView3D   - <i> R13 視点座標系３Ｄ頂点座標
;*
;* DESCRIPTION
;*
;*      面の代表点の取り出しと面の輝度計算
;*
;* POSTCONDITIONS
;* 
;* CAVEATS
;* 
;*************************************************************************
;
_SPR_3AllSurfaceBright:                ; function: SPR_3AllSurfaceBright
          MOV.L       R14,@-R15
          MOV.L       R13,@-R15
          MOV.L       R12,@-R15
          MOV.L       R11,@-R15
          MOV.L       R10,@-R15
          MOV.L       R9,@-R15
          MOV.L       R8,@-R15
          STS.L       MACH,@-R15
          STS.L       MACL,@-R15
;
          MOV.L       @(36,R15),R8	; R8  = lightVector
          MOV.L       @(40,R15),R9	; R9  = surfCnt
          MOV.L       @(44,R15),R13	; R13 = coordView3D
          ADD         #-12,R15
          MOV.L       R15,R11           ; R11 = surfNormal
  	  MOV	      #16,R3
  	  MOV	      #32,R14
	  MOV.L       COLOR_INHI,R12    ; R12 = 0xffff0000
;
_SPR_3ASB00:
;
; Get 3D View Coord Point
          MOV.W       @R5,R1		; R1 = point idx
          EXTU.W      R1,R1
          MOV         #12,R0
          MULU        R1,R0
          STS         MACL,R10
          ADD         R13,R10           ; R10 = R13 + R1*12 : 3D point data
;
          MOV.L       @(8,R10),R0       ; R0 = Zn 
          CMP/EQ      #0,R0             ; if(Zn == 0)
          BT          _SPR_3ASB02       ;    goto _SPR_3ASB02
;
; Coord Trans Normal Vector
          MOV         R6,R1      ; R1 = (Nx, Ny, Nz)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0
	  MOV.L       R0,@R11    ; surfNormal.x = M00Nx+M01Ny+M02Nz
          ADD         #4,R4
;
          MOV         R6,R1      ; R1 = (Nx, Ny, Nz)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0
	  MOV.L       R0,@(4,R11) ; surfNormal.y = M10Nx+M11Ny+M12Nz
          ADD         #4,R4
;
          MOV         R6,R1      ; R1 = (Nx, Ny, Nz)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0
	  MOV.L       R0,@(8,R11) ; surfNormal.z = M20Nx+M21Ny+M22Nz
          ADD         #-44,R4
;
; R2:R0 = MTH_Product(normVector, lightVector);
;
          MOV         R8,R1      ; R1 = (Lx, Ly, Lz) = light vector
          MOV         R11,R2     ; R2 = surfNormal
	  CLRMAC
	  MAC.L       @R2+,@R1+
	  MAC.L       @R2+,@R1+
	  MAC.L       @R2+,@R1+
 	  STS	      MACH,R2
 	  STS	      MACL,R0
;
; color = MTH_FixedToInt((product + SPR_3FIXED(1.0)) * (32/2));
;
	  ADD	      #1,R2
 	  XTRCT	      R2,R0	; xtract for Fixed32
	  DMULS.L     R3,R0
 	  STS	      MACL,R0
	  SHLR16      R0
          CMP/HI      R0,R14
          BT          _SPR_3ASB03
          MOV         #31,R0
_SPR_3ASB03:
;
; R2:R0 = MTH_Product((Fixed32*)viewVector, (Fixed32*)surfNormal);
;
          MOV         R10,R1     ; R1 = viewVector
          MOV         R11,R2     ; R2 = surfNormal
	  CLRMAC
	  MAC.L       @R2+,@R1+
	  MAC.L       @R2+,@R1+
	  MAC.L       @R2+,@R1+
 	  STS	      MACH,R1
 	  STS	      MACL,R2
 	  XTRCT	      R1,R2	; xtract for Fixed32
          NEG         R2,R2
;
          CMP/PL      R2
          BT          _SPR_3ASB01
_SPR_3ASB02:
          OR          R12,R0
_SPR_3ASB01:
          MOV.L       R0,@R7
          ADD         #12,R5
          ADD         #12,R6
          DT          R9
          BF/S        _SPR_3ASB00
          ADD         #4,R7
;
          ADD         #12,R15
          LDS.L       @R15+,MACL
          LDS.L       @R15+,MACH
          MOV.L       @R15+,R8
          MOV.L       @R15+,R9
          MOV.L       @R15+,R10
          MOV.L       @R15+,R11
          MOV.L       @R15+,R12
          MOV.L       @R15+,R13
          RTS
          MOV.L       @R15+,R14
;
	.ALIGN	4
COLOR_INHI .DATA.L	H'FFFF0000
;
;
;*************************************************************************
;*
;* NAME : SPR_3AllVertBright  -  Compute All Vertices Bright
;*
;*     void    SPR_3AllVertBright(MthMatrix *matrix,
;*                               MthXyz *vertNormal, Sint32 *vertBright,
;*                               MthXyz *lightVector, Sint32 vertCnt);
;*
;* PARAMETERS
;*
;* 　　(1) MthMatrix *matrix        - <i> R4 座標変換マトリックス
;* 　　(3) MthXyz    *vertNormal    - <i> R5 頂点の法線ベクトル
;* 　　(4) Sint32    *vertBright    - <o> R6 頂点の輝度計算結果
;* 　　(5) MthXyz    *lightVector   - <i> R7 光源ベクトル
;* 　　(6) Sint32    vertCnt        - <i> R8 頂点数
;*
;* DESCRIPTION
;*
;*      頂点法線の座標変換と頂点の輝度計算
;*
;* POSTCONDITIONS
;* 
;* CAVEATS
;* 
;*************************************************************************
;
_SPR_3AllVertBright:                ; function: SPR_3AllVertBright
          MOV.L       R10,@-R15
          MOV.L       R9,@-R15
          MOV.L       R8,@-R15
          STS.L       MACH,@-R15
          STS.L       MACL,@-R15
;
          MOV.L       @(20,R15),R8	; R8  = vertCnt
          ADD         #-12,R15
          MOV.L       R15,R9            ; R9  = transed vert normal
   	  MOV	      #16,R3
   	  MOV	      #32,R10
;
_SPR_3AVB00:
;
; Coord Trans Normal Vector
          MOV         R5,R1      ; R1 = (Nx, Ny, Nz)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0      ; R0 = Ax = M00Nx+M01Ny+M02Nz
          MOV.L       R0,@R9
          ADD         #4,R4
;
          MOV         R5,R1      ; R1 = (Nx, Ny, Nz)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0      ; R0 = Ay = M10Nx+M11Ny+M12Nz
          MOV.L       R0,@(4,R9)
          ADD         #4,R4
;
          MOV         R5,R1      ; R1 = (Nx, Ny, Nz)
          CLRMAC
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
          MAC.L       @R4+,@R1+
  	  STS	      MACH,R1
	  STS	      MACL,R0
	  XTRCT	      R1,R0      ; R0 = Az = M20Nx+M21Ny+M22Nz
          MOV.L       R0,@(8,R9)
          ADD         #-44,R4
;
; R2:R0 = MTH_Product(normVector, lightVector);
;
          MOV         R7,R1      ; R1 = (Lx, Ly, Lz) = light vector
          MOV         R9,R2      ; R2 = vertNormal
	  CLRMAC
	  MAC.L       @R2+,@R1+
	  MAC.L       @R2+,@R1+
	  MAC.L       @R2+,@R1+
 	  STS	      MACH,R2
 	  STS	      MACL,R0
;
; color = MTH_FixedToInt((product + SPR_3FIXED(1.0)) * (32/2));
;
	  ADD	      #1,R2
 	  XTRCT	      R2,R0	; xtract for Fixed32
	  DMULS.L     R3,R0
 	  STS	      MACL,R0
	  SHLR16      R0
          CMP/HI      R0,R10
          BT          _SPR_3AVB03
          MOV         #31,R0
_SPR_3AVB03:
          MOV.L       R0,@R6
;
          ADD         #12,R5
          DT          R8
          BF/S        _SPR_3AVB00
          ADD         #4,R6
;
          ADD         #12,R15
          LDS.L       @R15+,MACL
          LDS.L       @R15+,MACH
          MOV.L       @R15+,R8
          MOV.L       @R15+,R9
          RTS
          MOV.L       @R15+,R10
;
          .END
